package prac;

import java.util.Scanner;

/**
 * 题目描述
 * IGMP协议 中，有一个字段称作最大响应时间(Max Response Time),HOST收到查询报文，解折出MaxResponsetime字段后，需要在[0,MaxResponseTime]时间(s)内选
 * 取随机时间回应一个响应报文，如果在随机时间内收到一个新的查询报文，则会根据两者时间的大小，选取小的一方刷新回应时间。
 * 最大响应时间有如下计算方式：
 * 当Max Resp Code <128, Max Resp Time = Max Resp Code;
 * 当Max Resp Code≥128,
 * 0 1 2 3 4 5 6 7
 * +-+-+-+-+-+-+-+-+
 * | 1| exp | mant|
 * +-+-+-+-+-+-+-+-+
 * Max Resp Time =(mant|0x10)<<(exp+3);注：exp最大响应时间的高5~7位mant为最大响应时间的低4位。
 * 其中接收到的MaxRespCode 最大值 为255,以上出现所有字段均为无符号数。
 * 现在我们认为HOST收到查询报文时，选取的随机时间必定为最大值，现给出HOST收到查询报文个数C,HOST收到该报文的时间T,
 * 以及查询报文的最大响应时间字段值M,请计算出HOST发送响应报文的时间。
 * 输入描述
 * 第一行为查询报文个数C, 后续每行分别为HOST收到报文时间T,及最大响应时间M,以空格分割。
 * 输出描述
 * HOST发送响应报文的时间。
 * 备注
 * 用例确定只会发送一个响应报文，不存在计时结束后依然收到查询报文的情况。
 */
public class BaoWen {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

// 读取查询报文个数
        int n = scanner.nextInt();
// 初始化最大响应时间
        int up = 2000000000; // 使用较大的初始值

        // 循环处理每一个查询报文
        for (int i = 0; i < n; i++) {
            // 读取报文的时间T和最大响应时间字段值M
            int T = scanner.nextInt();
            int M = scanner.nextInt();
            // 计算实际最大响应时间
            int maxRespTime = calc(M);
            // 更新最小的响应时间
            up = Math.min(up, T + maxRespTime);
        }

        // 输出HOST发送响应报文的时间
        System.out.println(up);
    }

    public static int calc(int m) {
        // 根据最大响应时间字段值M计算出实际的最大响应时间
        if (m < 128) {
            // 当M小于128时，Max Resp Time = M
            return m;
        } else {
            // 提取高3位和低4位并计算Max Resp Time
            int exp = (m & 0b01110000) >> 4;
            int mant = m & 0b1111;
            int base = mant | 0x10;
            int shift = exp + 3;
            return base << shift;
        }
    }
}